/**
 * @file bitLogic.c
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2025-04-29
 *
 * @copyright Copyright (c) 2025
 *
 */

#include "bitLogic.h"
Bool Contact(Bool in, Bool operand) {
  if (!in) {
    return false;
  }
  return operand;
}
/**
 * @brief 扫描操作数的信号上升沿
 * @note 可以确定所指定操作数（operand）的信号状态是否从“0”变为“1”。该指令将比较
 * <operand>
 * 的当前信号状态与上一次扫描的信号状态，上一次扫描的信号状态保存在边沿存储位（bit）中。如果该指令检测到逻辑运算结果
 * (RLO)
 * 从“0”变为“1”，则说明出现了一个上升沿。每次执行指令时，都会查询信号上升沿。检测到信号上升沿时，<operand>
 * 的信号状态将在一个程序周期内保持置位为“1”。在其它任何情况下，操作数的信号状态均为“0”。在该指令上方的操作数占位符中，指定要查询的操作数（operand）。在该指令下方的操作数占位符中，指定边沿存储位（bit）。
 *
 * @param pre 能流
 * @param bit 边沿存储位，保存上一次的信号状态 (通过指针更新)
 * @param operand 当前操作数的信号状态 (0 或 1)
 * @return Bool
 */
Bool PContact(Bool pre, Bool operand, Bool *bit) {
  /* 如果没有能流，直接返回 false*/
  if (!pre) {
    return false;
  }
  Bool res = false;
  /*检查上升沿：上一次状态为 0，当前状态为 1*/
  if (!(*bit) && operand) {
    res = true; /*检测到上升沿，置位为 1*/
  }

  *bit = operand; /*更新边沿存储位为当前状态*/
  return res;
}
/**
 * @brief Main function to test the falling edge detection.
 *
 * This program tests the detect_falling_edge function with a sequence of
 * operand states and power flow inputs, printing the results for each cycle.
 *
 * @return int Returns 0 on successful execution.
 */

/**
 * @brief 扫描操作数的信号下降沿
 * 该函数检查当能流有效时，操作数的信号状态是否从“1”变为“0”（下降沿）。
 * 它将当前操作数状态与存储在边沿存储位中的上一次状态进行比较。
 * 如果检测到下降沿，结果在一个程序周期内置位为“1”。
 * 仅当能流有效时，才更新边沿存储位。
 *
 * @param pre 能流输入（true 表示启用检测，false 表示禁用）
 * @param bit 指向边沿存储位的指针，保存上一次信号状态
 * @param operand 当前操作数的信号状态（0 或 1）
 * @return Bool 如果检测到下降沿且能流有效，返回 true（1）；否则返回 false（0）
 */
Bool NContact(Bool pre, Bool operand, Bool *bit) {
  // 如果没有能流，直接返回 false，不更新边沿存储位
  if (!pre) {
    return false;
  }
  Bool res = false;

  // 检查下降沿：上一次状态为 1，当前状态为 0
  if (*bit && !operand) {
    res = true; // 检测到下降沿，置位为 1
  }
  // 更新边沿存储位为当前操作数状态
  *bit = operand;
  return res;
}

/**
 * @brief 测试函数，用于测试下降沿检测
 *
 * 该程序通过一系列操作数状态和能流输入测试 detect_falling_edge 函数，
 * 并打印每个周期的结果。
 *
 */

Bool Not(Bool in) { return !in; }
Bool Coil(Bool in, Bool *operand) {
  *operand = in;
  return true;
}

/**
 * @brief 复位输出
 *
 * @param in 能流输入（true 表示 RLO = “1”，false 表示 RLO = “0”）
 * @param operand 指向操作数的指针，表示要置位的信号状态
 * @return Bool
 */
Bool RCoil(Bool in, Bool *operand) {
  if (in) {
    *operand = false;
  } else {
    return false;
  }
  return true;
}
/**
 * @brief 置位输出
 *
 * @param in 能流输入（true 表示 RLO = “1”，false 表示 RLO = “0”）
 * @param operand 指向操作数的指针，表示要置位的信号状态
 * @return Bool
 */
Bool SCoil(Bool in, Bool *operand) {
  if (in) {
    *operand = true;
  } else {
    return false;
  }
  return true;
}

/**
 * @brief 在信号上升沿置位操作数
 *
 * 该函数检测逻辑运算结果（RLO）的上升沿（从“0”变为“1”），并在检测到上升沿时将指定操作数置位为“1”。
 * 它将当前 RLO 与边沿存储位中保存的上次 RLO 状态进行比较。
 * 如果检测到上升沿，操作数在一个程序周期内置位为“1”；否则，操作数保持为“0”。
 * 每次执行时，边沿存储位都会更新为当前 RLO 状态。
 *
 * @param in 当前逻辑运算结果（RLO，true 表示“1”，false 表示“0”）
 * @param operand 指向要置位的操作数的指针（<操作数 1>）
 * @param bit 指向边沿存储位的指针（<操作数 2>），保存上一次 RLO 状态
 */
Bool PCoil(Bool in, Bool *operand, Bool *bit) {

  // 检查上升沿：上一次 RLO 为 0，当前 RLO 为 1
  if (!(*bit) && in) {
    *operand = true; // 检测到上升沿，置位操作数为 1
  }

  // 更新边沿存储位为当前 RLO 状态
  *bit = in;
  return true;
}

/**
 * @brief 在信号下降沿置位操作数
 *
 * 该函数检测逻辑运算结果（RLO）的下降沿（从“1”变为“0”），并在检测到下降沿时将指定操作数置位为“1”。
 * 它将当前 RLO 与边沿存储位中保存的上次 RLO 状态进行比较。
 * 如果检测到下降沿，操作数在一个程序周期内置位为“1”；否则，操作数保持为“0”。
 * 每次执行时，边沿存储位都会更新为当前 RLO 状态。
 *
 * @param in 当前逻辑运算结果（RLO，true 表示“1”，false 表示“0”）
 * @param operand 指向要置位的操作数的指针（<操作数 1>）
 * @param bit 指向边沿存储位的指针（<操作数 2>），保存上一次 RLO 状态
 */
Bool NCoil(Bool in, Bool *operand, Bool *bit) {

  // 检查下降沿：上一次 RLO 为 1，当前 RLO 为 0
  if (*bit && !in) {
    *operand = true; // 检测到下降沿，置位操作数为 1
  }

  // 更新边沿存储位为当前 RLO 状态
  *bit = in;
  return true;
}
